/**********************************************************************
* Filename: Estadio.java
* Created: 2012/04/30
* @author Fernando Brito e Abreu
**********************************************************************/
package org.bunny.businessLayer;

import java.util.Set;
import java.util.HashSet;

public class Estadio{
	public static Set<Estadio> allInstances = new HashSet<Estadio>();
	
	private int inauguracao;
	private int lotacao;
	private String nome;
	private Cidade cidade;
	
	/**********************************************************************
	* Default constructor
	**********************************************************************/
	public Estadio(){
		allInstances.add(this);
	}
	
	/**********************************************************************
	* Parameterized constructor
	* @param inauguracao the inauguracao to initialize
	* @param lotacao the lotacao to initialize
	* @param nome the nome to initialize
	* @param cidade the cidade to initialize
	**********************************************************************/
	public Estadio(int inauguracao, int lotacao, String nome, Cidade cidade){
		this.inauguracao = inauguracao;
		this.lotacao = lotacao;
		this.nome = nome;
		this.cidade = cidade;
		allInstances.add(this);
	}
	
	/**********************************************************************
	* Standard attribute getter
	* @return the inauguracao of the estadio
	**********************************************************************/
	public int inauguracao(){
		return inauguracao;
	}
	
	/**********************************************************************
	* Standard attribute setter
	* @param inauguracao the inauguracao to set
	**********************************************************************/
	public void setInauguracao(int inauguracao){
		this.inauguracao = inauguracao;
	}
	
	/**********************************************************************
	* Standard attribute getter
	* @return the lotacao of the estadio
	**********************************************************************/
	public int lotacao(){
		return lotacao;
	}
	
	/**********************************************************************
	* Standard attribute setter
	* @param lotacao the lotacao to set
	**********************************************************************/
	public void setLotacao(int lotacao){
		this.lotacao = lotacao;
	}
	
	/**********************************************************************
	* Standard attribute getter
	* @return the nome of the estadio
	**********************************************************************/
	public String nome(){
		return nome;
	}
	
	/**********************************************************************
	* Standard attribute setter
	* @param nome the nome to set
	**********************************************************************/
	public void setNome(String nome){
		this.nome = nome;
	}
	
	/**********************************************************************
	* ONE2MANY getter for Estadio[*] <-> Cidade[1]
	* @return the cidade of the estadio
	**********************************************************************/
	public Cidade cidade(){
		return cidade;
	}
	
	/**********************************************************************
	* ONE2MANY setter for Estadio[*] <-> Cidade[1]
	* @param cidade the cidade to set
	**********************************************************************/
	public void setCidade(Cidade cidade){
		this.cidade = cidade;
	}
	
	/**********************************************************************
	* ONE2MANY getter for Estadio[1] <-> Jogo[*]
	* @return the jogos of the estadio
	**********************************************************************/
	public Set<Jogo> jogos(){
		Set<Jogo> result = new HashSet<Jogo>();
		for (Jogo x : Jogo.allInstances){
			if (x.estadio()  ==  this)
				result.add(x);
		}
		return result;
	}
	
	/**********************************************************************
	* ONE2MANY setter for Estadio[1] <-> Jogo[*]
	* @param jogos the jogos to set
	**********************************************************************/
	public void setJogos(Set<Jogo> jogos){
		for (Jogo x : jogos){
			x.setEstadio(this);
		}
	}
	
//	/**********************************************************************
//	* User-defined operation specified in SOIL/OCL
//	* @param nome the nome to set
//	* @param inauguracao the inauguracao to set
//	* @param lotacao the lotacao to set
//	* @param cidade the cidade to set
//	**********************************************************************/
//	public void inicializa(String nome, int inauguracao, int lotacao, Cidade cidade){
//		//	TODO
//		this.nome = nome;
//		this.inauguracao = inauguracao;
//		this.lotacao = lotacao;
//		//	self.nome := nome;
//		//	 self.inauguracao := inauguracao;
//		//	 self.lotacao := lotacao;
//		//	 insert (cidade,self) into Cidade_Estadio;
//	}
	
	//	PRE-CONDITIONS (TODO)
	/*
	pre ArgumentosEstadioForamInicializados
		((((nome.isDefined and inauguracao.isDefined) and lotacao.isDefined) and cidade.isDefined) and Cidade.allInstances->includes(cidade))
	
	*/
	
	//	POST-CONDITIONS (TODO)
	/*
	post EstadioInicializado
		((self.nome.isDefined and self.inauguracao.isDefined) and self.lotacao.isDefined)
	
	*/
	
	/* (non-Javadoc)
	* @see java.lang.Object#toString()
	*/
	@Override
	/**********************************************************************
	* Object serializer
	**********************************************************************/
	public String toString(){
		return "Estadio [inauguracao=" + inauguracao + ", lotacao=" + lotacao + ", nome=" + nome + ", cidade=" + cidade + "]\n";
	}
	
	//	-------------------------------------------------------------------------------
	//	INVARIANTS (TODO)
	/*
	inv TamanhoMaxNomeEstadio
		((self.nome.size > 2) and (self.nome.size < 64))
	
	inv LotacaoMinMaxEstadio
		((self.lotacao > 0) and (self.lotacao < 160000))
	
	*/
}
